FFmpeg获取DirectShow设备数据(摄像头,录屏)

您所在的位置:网站首页 ffmpeg 录屏命令 FFmpeg获取DirectShow设备数据(摄像头,录屏)

FFmpeg获取DirectShow设备数据(摄像头,录屏)

#FFmpeg获取DirectShow设备数据(摄像头,录屏)| 来源: 网络整理| 查看: 265

FFmpeg获取DirectShow设备数据(摄像头,录屏)

这两天研究了 FFmpeg 获取 DirectShow 设备数据的方法,在此简单记录一下以作备忘。本文所述的方法主要是对应 Windows 平台的。

1.       列设备ffmpeg - list_devices true - f dshow - i dummy

命令执行后输出的结果如下(注:中文的设备会出现乱码的情况)。列表显示设备的名称很重要,输入的时候都是使用 "-f dshow -i video="{设备名}"" 的方式。

我自己的机器上列出了以下设备:

[dshow@0388f5e0] DirectShow video devices[dshow@0388f5e0]"Integrated Camera" [dshow@0388f5e0]"screen-capture-recorder" [dshow@0388f5e0] DirectShow audio devices[dshow@0388f5e0]"鍐呰楹﹀厠椋?(Conexant20672 SmartAudi" [dshow@0388f5e0]"virtual-audio-capturer"

下文的测试中,使用其中的两个视频输入:"Integrated Camera" 和 "screen-capture-recorder"。

注:音频设备出现乱码,这个问题的解决方法会随后提到。

2.       获取摄像头数据(保存为本地文件或者发送实时流)2.1. 编码为 H.264,保存为本地文件

下面这条命令,实现了从摄像头读取数据并编码为 H.264,最后保存成 mycamera.mkv。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec libx264 mycamera.mkv2.2. 直接播放摄像头的数据

使用 ffplay 可以直接播放摄像头的数据,命令如下:

ffplay - f dshow - i video = "Integrated Camera"

如果设备名称正确的话,会直接打开本机的摄像头,如图所示。

注:除了使用 DirectShow 作为输入外,使用 VFW 也可以读取到摄像头的数据,例如下述命令可以播放摄像头数据:

ffplay - f vfwcap - i 0

此外,可以使用 FFmpeg 的 list_options 查看设备的选项:

ffmpeg - list_options true - f dshow - i video = "Integrated Camera"输出如下:[dshow@03845420] DirectShow video device options[dshow@03845420] Pin "鎹曡幏" [dshow@03845420] pixel_format = bgr24 min s = 640x480 fps = 15 max s = 640x480 fps = 30[dshow@03845420] pixel_format = bgr24 min s = 640x360 fps = 15 max s = 640x360 fps = 30[dshow@03845420] pixel_format = bgr24 min s = 352x288 fps = 15 max s = 352x288 fps = 30[dshow@03845420] pixel_format = bgr24 min s = 320x240 fps = 15 max s = 320x240 fps = 30[dshow@03845420] pixel_format = bgr24 min s = 800x448 fps = 1 max s = 800x448 fps = 15[dshow@03845420] pixel_format = bgr24 min s = 960x544 fps = 1 max s = 960x544 fps = 10[dshow@03845420] pixel_format = bgr24 min s = 1280x720 fps = 1 max s = 1280x720 fps = 10[dshow@03845420] pixel_format = bgr24 min s = 424x240 fps = 15 max s = 424x240 fps = 30[dshow@03845420] pixel_format = yuyv422 min s = 640x480 fps = 15 max s = 640x480 fps = 30[dshow@03845420] pixel_format = yuyv422 min s = 640x360 fps = 15 max s = 640x360 fps = 30[dshow@03845420] pixel_format = yuyv422 min s = 352x288 fps = 15 max s = 352x288 fps = 30[dshow@03845420] pixel_format = yuyv422 min s = 320x240 fps = 15 max s = 320x240 fps = 30[dshow@03845420] pixel_format = yuyv422 min s = 800x448 fps = 1 max s = 800x448 fps = 15[dshow@03845420] pixel_format = yuyv422 min s = 960x544 fps = 1 max s = 960x544 fps = 10[dshow@03845420] pixel_format = yuyv422 min s = 1280x720 fps = 1 max s = 1280x720 fps = 10[dshow@03845420] pixel_format = yuyv422 min s = 424x240 fps = 15 max s = 424x240 fps = 30[dshow@03845420] vcodec = mjpeg min s = 640x480 fps = 15 max s = 640x480 fps = 30[dshow@03845420] vcodec = mjpeg min s = 640x360 fps = 15 max s = 640x360 fps = 30[dshow@03845420] vcodec = mjpeg min s = 352x288 fps = 15 max s = 352x288 fps = 30[dshow@03845420] vcodec = mjpeg min s = 320x240 fps = 15 max s = 320x240 fps = 30[dshow@03845420] vcodec = mjpeg min s = 800x448 fps = 15 max s = 800x448 fps = 30[dshow@03845420] vcodec = mjpeg min s = 960x544 fps = 15 max s = 960x544 fps = 30[dshow@03845420] vcodec = mjpeg min s = 1280x720 fps = 15 max s = 1280x720 fps = 30

可以通过输出信息设置摄像头的参数。

例如,设置摄像头分辨率为 1280x720

ffplay - s 1280x720 - f dshow - i video = "Integrated Camera"设置分辨率为 424x240ffplay - s 424x240 - f dshow - i video = "Integrated Camera"2.3. 编码为 H.264,发布 UDP

下面这条命令,实现了:获取摄像头数据 -> 编码为 H.264-> 封装为 UDP 并发送至组播地址。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f h264 udp: //233.233.233.223:6666

注 1:考虑到提高 libx264 的编码速度,添加了 - preset:v ultrafast 和 - tune:v zerolatency 两个选项。

注 2:高分辨率的情况下,使用 UDP 可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如 - s 320x240)调小分辨率。

2.4. 编码为 H.264,发布 RTP

下面这条命令,实现了:获取摄像头数据 -> 编码为 H.264-> 封装为 RTP 并发送至组播地址。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f rtp rtp: //233.233.233.223:6666>test.sdp

注 1:考虑到提高 libx264 的编码速度,添加了 - preset:v ultrafast 和 - tune:v zerolatency 两个选项。

注 2:结尾添加 ">test.sdp" 可以在发布的同时生成 sdp 文件。该文件可以用于该视频流的播放。

2.5. 编码为 H.264,发布 RTMP

下面这条命令,实现了:获取摄像头数据 -> 编码为 H.264-> 并发送至 RTMP 服务器。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f flv rtmp: //localhost/oflaDemo/livestream2.6. 编码为 MPEG2,发布 UDP

与编码为 H.264 类似,指明 - vcodec 即可。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec mpeg2video - f mpeg2video udp: //233.233.233.223:6666

播放 MPEG2 的 UDP 流如下。指明 - vcodec 为 mpeg2video 即可

ffplay - vcodec mpeg2video udp: //233.233.233.223:66663.       屏幕录制(Windows 平台下保存为本地文件或者发送实时流)

Linux 下使用 FFmpeg 进行屏幕录制相对比较方便,可以使用 x11grab,使用如下的命令:

ffmpeg - f x11grab - s 1600x900 - r 50 - vcodec libx264–preset: v ultrafast–tune: v zerolatency - crf 18 - f mpegts udp: //localhost:1234

详细时使用方式可以参考这篇文章:

Linux 录屏在这里不再赘述。在 Windows 平台下屏幕录像则要稍微复杂一些。在 Windows 平台下,使用 - dshow 取代 x11grab。一句话介绍:注册录屏 dshow 滤镜(例如 screen-capture-recorder),然后通过 dshow 获取录屏图像然后编码处理。

因此,在使用 FFmpeg 屏幕录像之前,需要先安装 dshow 滤镜。在这里推荐一个软件:screen capture recorder。安装这个软件之后,就可以通过 FFmpeg 屏幕录像了。

screen capture recorder 项目主页:

下载地址:

下载完后,一路 "Next" 即可安装完毕。注意,需要 Java 运行环境(Java Runtime Environment),如果没有的话下载一个就行。

screen capture recorder 本身就可以录屏,不过这里我们使用 FFmpeg 进行录屏。

3.1. 编码为 H.264,保存为本地文件

下面的命令可以将屏幕录制后编码为 H.264 并保存为本地文件。

ffmpeg - f dshow - i video = "screen-capture-recorder" - r 5 - vcodec libx264 - preset: v ultrafast - tune: v zerolatency MyDesktop.mkv

注:"-r 5" 的意思是把帧率设置成 5。         

最后得到的效果如下图。

此外,也可以录声音,声音输入可以分成两种:一种是真人说话的声音,通过话筒输入;一种是虚拟的声音,即录屏的时候电脑耳机里的声音。下面两条命令可以分别录制话筒的声音和电脑耳机里的声音。

录屏,伴随话筒输入的声音

ffmpeg - f dshow - i video = "screen-capture-recorder" - f dshow - i audio = "鍐呰楹﹀厠椋?(Conexant 20672 SmartAudi" - r 5 - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - acodec libmp3lame MyDesktop.mkv

上述命令有问题:audio 那里有乱码,把乱码 ANSI 转 UTF-8 之后,开始测试不行,后来发现是自己疏忽大意,乱码部分转码后为 "内装麦克风",然后接可以正常使用了。因此,命令应该如下图所示:

ffmpeg - f dshow - i video = "screen-capture-recorder" - f dshow - i audio = "内装麦克风 (Conexant 20672 SmartAudi" - r 5 - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - acodec libmp3lame MyDesktop.mkv注:

如果不熟悉 ANSI 转码 UTF-8 的话,还有一种更简单的方式查看设备的名称。即不使用 FFmpeg 查看系统 DirectShow 输入设备的名称,而使用 DirectShow SDK 自带的工具 GraphEdit(或者网上下一个 GraphStudioNext)查看输入名称。

打开 GraphEdit 选择 "图像 -> 插入滤镜 "

然后就可以通过查看 Audio Capture Sources 来查看音频输入设备的简体中文名称了。从图中可以看出是 "内装麦克风 (Conexant 20672 SmartAudi"。

PS:感觉这条命令适合做讲座之类的时候使用

录屏,伴随耳机输入的声音

ffmpeg - f dshow - i video = "screen-capture-recorder" - f dshow - i audio = "virtual-audio-capturer" - r 5 - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - acodec libmp3lame MyDesktop.mkv

PS:测这条命令的时候,这在听歌,因此录制的视频中的音频就是那首歌曲。

3.2. 编码为 H.264,发布 UDP

下面的命令可以将屏幕录制后编码为 H.264 并封装成 UDP 发送到组播地址

ffmpeg - f dshow - i video = "screen-capture-recorder" - r 5 - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f h264 udp: //233.233.233.223:6666

注 1:考虑到提高 libx264 的编码速度,添加了 - preset:v ultrafast 和 - tune:v zerolatency 两个选项。

注 2:高分辨率的情况下,使用 UDP 可能出现丢包的情况。为了避免这种情况,可以添加–s 参数(例如 - s 320x240)调小分辨率。

3.3. 编码为 H.264,发布 RTP

下面的命令可以将屏幕录制后编码为 H.264 并封装成 RTP 并发送到组播地址

ffmpeg - f dshow - i video = "screen-capture-recorder" - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f rtp rtp: //233.233.233.223:6666>test.sdp

注 1:考虑到提高 libx264 的编码速度,添加了 - preset:v ultrafast 和 - tune:v zerolatency 两个选项。

注 2:结尾添加 ">test.sdp" 可以在发布的同时生成 sdp 文件。该文件可以用于该视频流的播放。如下命令即可播放:

ffplay test.sdp3.4. 编码为 H.264,发布 RTMP

原理同上,不再赘述。

ffmpeg - f dshow - i video = "Integrated Camera" - vcodec libx264 - preset: v ultrafast - tune: v zerolatency - f flv rtmp: //localhost/oflaDemo/livestream

注意:播放 RTMP 的时候,-max_delay 参数会比较明显的影响延迟,将此参数值设定小一些,有利于降低延时。

ffplay - max_delay 100000 "rtmp://localhost/oflaDemo/livestream live=1"4. 另一种屏幕录制的方式(2014.10.1 更新)

来源: http://lib.csdn.net/article/liveplay/42779

与本文相关文章 以 LeetCode 为例 -- 如何发送 GraphQL Query 获取数据 SpringMVC06以对象的方式获取前台的数据 获取图片方法 2. 使用 apache 提供的 HttpClient 进行网络中数据的获取; C#获取随机数 获取当前时间 react native 获取设备 真实 ip 地址 和 ip 映射的地理位置 EF获取非跟踪数据之DBSet.AsNoTracking()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3